<?php
// +----------------------------------------------------------------------
// |     【FabricMain】Service服务类
// +----------------------------------------------------------------------

declare (strict_types = 1);

namespace app\common\service;

use think\facade\Request;
use app\common\model\FabricMain as M;
use app\common\validate\FabricMain as V;

class FabricMain{
    // 添加
    public static function goAdd($data){
        //验证
        $validate = new V;
        if(!$validate->scene('add')->check($data))
        return ['msg'=>$validate->getError(),'code'=>201];
        try {
			$data=self::dataFormat($data,'add');
            M::create($data);
        }catch (\Exception $e){
            return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
        }
    }
    
    // 编辑
    public static function goEdit($data,$id){
    	$where = is_array($id) ? $id : ['id'=>$id];
        //验证
        $validate = new V;
        if(!$validate->scene('edit')->check($data))
        return ['msg'=>$validate->getError(),'code'=>201];
        try {
			$data=self::dataFormat($data,'edit');
             M::update($data,$where);
        }catch (\Exception $e){
            return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
        }
    }

    // 状态
    public static function goStatus($data,$id){
        $model = is_array($id) ? M::where($id)->find() : M::find($id);
        if ($model->isEmpty())  return ['msg'=>'数据不存在','code'=>201];
        try{
            $model->save($data);
        }catch (\Exception $e){
            return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
        }
    }

    // 删除
    public static function goRemove($id){
	$model = is_array($id) ? M::where($id)->find() : M::find($id);
        if ($model->isEmpty()) return ['msg'=>'数据不存在','code'=>201];
        try{
           $model->delete();
        }catch (\Exception $e){
            return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
        }
    }

    // 批量删除
    public static function goBatchRemove($ids){
        if (!is_array($ids)) return ['msg'=>'数据不存在','code'=>201];
		$model = M::where($ids)->select();
        try{
            $model->delete();
        }catch (\Exception $e){
            return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
        }
    }

    // 获取列表
    public static function goRecycle($where = []){
        if (Request::isPost()){
            $ids = Request::param('ids');
			$where[]=['id','in',$ids];
            if (!is_array($ids)) return ['msg'=>'参数错误','code'=>'201'];
            try{
                if(Request::param('type')){
                    $data = M::onlyTrashed()->where($where)->select();
                    foreach($data as $k){
                        $k->restore();
                    }
                }else{
                    M::destroy($ids,true);
                }
            }catch (\Exception $e){
                return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
            }
            return ['msg'=>'操作成功'];
        }
        //按用户名
        
        $limit = I('get.limit/d');
        
               //按面料编号查找
               if ($fabric_code = I("fabric_code")) {
                   $where[] = ["fabric_code", "like", "%" . $fabric_code . "%"];
               }
               //按面料名称查找
               if ($fabric_name = I("fabric_name")) {
                   $where[] = ["fabric_name", "like", "%" . $fabric_name . "%"];
               }
               //按供应商名称查找
               if ($sup_name = I("sup_name")) {
                   $where[] = ["sup_name", "like", "%" . $sup_name . "%"];
               }
               //按供应编号查找
               if ($sup_code = I("sup_code")) {
                   $where[] = ["sup_code", "like", "%" . $sup_code . "%"];
               }
        $list = M::onlyTrashed()->where($where)->paginate($limit);
        return ['code'=>0,'data'=>$list->items(),'extend'=>['count' => $list->total(), 'limit' => $limit]];
    }
	
	//修改某个参数
	public static function setFieldValue($data,$where=[]){
		if(empty($where)){
			$model =  M::find($data['id']);
		}else{
			$model = M::where($where)->find();
		}
		if ($model->isEmpty())  return ['msg'=>'数据不存在','code'=>201];
		try{
		    $model->save([
		        $data['field'] => $data['value'],
		    ]);
			return ['msg'=>'操作成功'];
		}catch (\Exception $e){
		    return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
		}
	}
    
    // 更新产品模板信息
    private static function generateInfoData($data){
        return sprintf(
            "编号：%s # %s\n".
            "幅宽：%scm\n".
            "克重：%sg\n".
            "剪板：%s 元/米\n".
            "大货价：%s 元/kg\n\n".
            "纸管空差：%s + %s\n".
            "加价颜色：%s",
            $data['fabric_code'] ?? '',
            $data['fabric_name'] ?? '',
            $data['width'] ?? '',
            $data['weight'] ?? '',
            $data['cut_price'] ?? '',
            self::calcSalesPrice($data).'（'.$data['bulk_price'].'）',
            $data['tube'] ?? '',
            $data['empty_diff'] ?? '',
            $data['markup'] ?? ''
        );
    }
    
    // 计算销售毛重单价（自定义舍入规则）
    private static function calcSalesPrice($record) {
        
        // 预设公斤数（如果没有提供则用默认值28）
        $preset_kg = isset($record['preset_kg']) ? (float)$record['preset_kg'] : 28;
        
        // 来货参数（字符串转数字）
        $sup_tube = (float)($record['sup_tube'] ?? 0);
        $sup_empty = (float)($record['sup_empty'] ?? 0);
        $return_diff = (float)($record['return_diff'] ?? 0);
        $bulk_price = (float)($record['bulk_price'] ?? 0);
        
        // 销售参数（字符串转数字）
        $tube = (float)($record['tube'] ?? 0);
        $empty_diff = (float)($record['empty_diff'] ?? 0);
        
        // 检查必要参数是否有效
        if ($bulk_price <= 0) {
            return 0; // 如果来货单价为空或0，返回0
        }
        
        // 1. 计算来货净布重量
        $net_cloth_weight = $preset_kg - $sup_tube - $sup_empty;
        
        // 避免除数为0
        if ($net_cloth_weight <= 0) {
            return 0;
        }
        
        // 2. 计算来货净布价格（元/公斤）
        $net_cloth_price_per_kg = (($preset_kg - $return_diff) * $bulk_price) / $net_cloth_weight;
        
        // 3. 计算销售毛重单价
        $sales_gross_weight = $net_cloth_weight + $tube + $empty_diff;
        
        // 避免除数为0
        if ($sales_gross_weight <= 0) {
            return 0;
        }
        
        $sales_price_per_gross_kg = ($net_cloth_price_per_kg * $net_cloth_weight) / $sales_gross_weight;
        
        // 4. 自定义舍入规则
        return self::customRound($sales_price_per_gross_kg);
    }
    
    // 自定义舍入规则：
    private static function customRound($number) {
        $integer_part = floor($number);  // 整数部分
        $decimal_part = $number - $integer_part;  // 小数部分
        
        if ($decimal_part > 0.5) {
            // 大于0.5，进1位
            return $integer_part + 1;
        } elseif ($decimal_part > 0) {
            // 大于0且小于等于0.5，进0.5
            return $integer_part + 0.5;
        } else {
            // 小数部分为0，保持不变
            return $integer_part;
        }
    }
    
    //拷贝产品
    public static function copy($ids){
    	if(!is_array($ids)) $id=[$ids];
    	$i=0;
    	foreach($ids as $id){
    		$data=M::where(['id'=>$id])->find()->toArray();
    		$data['fabric_code']=$data['fabric_code'].'-CPOY';
    		$data['fabric_name']='副本 - '.$data['fabric_name'];
    		$data['update_time']=time();
    		$data['create_time']=time();
    		unset($data['id']);
    		try {
    		    M::create($data);
    			$i++;
    		}catch (\Exception $e){
    		    return ['msg'=>'操作失败'.$e->getMessage(),'code'=>201];
    		}
    	}
    	return ['msg'=>'成功复制 '.$i.' 条数据','data'=>['status'=>1]];
    }
	
	// 预处理添加和修改的数据
	public static function dataFormat($data,$type='add'){
		
		if($type == 'add'){					//添加时才处理
			
		}else if($type == 'edit'){			//修改时才处理
			
		}
        
        // 生成格式化文本
        $data['info_tpl'] = self::generateInfoData($data);
                    
		// 无论修改还是添加都处理

		return $data;
	}
}
